package com.example.service.impl;

import com.example.mapper.EmpExprMapper;
import com.example.mapper.EmpMapper;
import com.example.pojo.*;
import com.example.pojo.DO.EmpDO;
import com.example.pojo.DTO.EmpDTO;
import com.example.pojo.VO.EmpVO;
import com.example.service.EmpService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestParam;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMapper empExprMapper;
    @Autowired
    private EmpLogServiceImpl empLogServiceImpl;
    /**
     * 基于pagehelper分页查询
     * @return
     */
    @Override
    public PageResult<EmpVO> page(EemQueryParam empQueryParam) {
        //1.设置分页参数
        PageHelper.startPage(empQueryParam.getPage(), empQueryParam.getPageSize());
        //2.调用mapper接口查询
        List<EmpVO> empList = empMapper.list(empQueryParam);
        //3.解析并封装PageResult对象
        Page<EmpVO> p = (Page<EmpVO>) empList;
        return new PageResult<EmpVO>(p.getTotal(), p.getResult());
    }
    @Transactional//添加事务
    @Override
    //保存员工的基本信息
    public void save(EmpDTO empDTO) {
//        try {
        // 实例化DO对象
        EmpDO empDO = new EmpDO();
        // 属性拷贝
        BeanUtils.copyProperties(empDTO, empDO);
        empDO.setCreateTime(LocalDateTime.now());
        empDO.setUpdateTime(LocalDateTime.now());
        empMapper.insert(empDO);
        //保存员工工作经历信息
        List<EmpExpr> exprList = empDTO.getExprList();

        //判断员工是否有工作经历
        if(!CollectionUtils.isEmpty(exprList)){
            exprList.forEach(empExpr -> {
                empExpr.setEmpId(empDO.getId());
            });
            empExprMapper.insertBatch(exprList);
        }
//        } finally {//保存员工操作日志
//            EmpLog empLog = new EmpLog();
//            empLog.setOperateTime(LocalDateTime.now());
//            empLog.setInfo("保存员工基本信息:"+emp);
//            empLogServiceImpl.insertLog(empLog);
//        }
    }
    /**
     * 获取员工信息
     */
    @Override
    public EmpDTO getEmpInfoById(Integer id) {

        // 1.查询员工信息
        EmpDO empDO = empMapper.getEmpInfoById(id);
        // 2.实例化DTO对象
        EmpDTO empDTO = new EmpDTO();
        // 3.属性拷贝
        BeanUtils.copyProperties(empDO, empDTO);
        // 4.查询员工工作经历信息
        List<EmpExpr> exprList = empExprMapper.getEmpExprById(id);
        // 5.设置员工工作经历信息
        empDTO.setExprList(exprList);
        // 6.返回
        return empDTO;
    }
    @Transactional
    @Override
    public void update(EmpDTO empDTO) {
        EmpDO empDO = new EmpDO();
        //1.拷贝参数
        BeanUtils.copyProperties(empDTO, empDO);
//        根据id修改员工基本信息
        //2.设置修改时间
        empDO.setUpdateTime(LocalDateTime.now());
        empMapper.updateByEmpId(empDO);
        //修改员工工作经历信息,删除后重新插入
        //3.删除员工工作经历信息
        empExprMapper.deleteByEmpIds(Arrays.asList(empDO.getId()));
        //4.插入员工工作经历信息
        List<EmpExpr> exprList = empDTO.getExprList();
        //判断员工是否有工作经历
        if(!CollectionUtils.isEmpty(exprList)){
            exprList.forEach(empExpr -> {
                empExpr.setEmpId(empDO.getId());
            });
            empExprMapper.insertBatch(exprList);
        }
    }
    @Transactional
    @Override
    public void delete(List<Integer> ids) {
        //删除员工信息
        empMapper.deleteByIds(ids);
        //删除员工工作经历信息
        empExprMapper.deleteByEmpIds(ids);
    }
}

    /**
     * 原始分页查询的方法
     */
    //@Override
    //public PageResult<Emp> page(Integer page, Integer pageSize) {
    //    //1.调用mapper接口,查询总记录数
    //    Long total = empMapper.count();
    //    //2.调用mapper接口,查询结果列表
    //    Integer start = (page-1)*pageSize;
    //    List<Emp> rows = empMapper.list((page-1)*pageSize,pageSize);
    //    //3.封装PageResult对象
    //    return new PageResult<Emp>(total, rows);
    //}


